const express = require('express')
const router = express.Router()
const articlesCollection = require('../db/mongo')
const { ObjectId } = require('mongodb')

/* POST 创建文章. */
router.post('/', async (req, res, next) => {
  try {
    const sysCreateTime = new Date()
    const result = await articlesCollection.insertOne(req.body)
    const article = {
      _id: result.insertedId,
      ...req.body,
      sysCreateTime,
      sysUpdateTime: new Date()
    }
    res.status(201).json({
      article
    })
  } catch (err) {
    next(err)
  }
})

/* GET 获取文章列表. */
router.get('/', async (req, res, next) => {
  try {
    const { page = 1, size = 2 } = req.query
    // 全部查询
    // const result = await articlesCollection.find({})
    // 分页查询 skip 为跳过几条数据 limit 为查询数量 limit 必须为数字
    const result = await articlesCollection.find({}).skip((page - 1) * size).limit(+size)
    // 获取总条数
    const count = await articlesCollection.countDocuments()
    // 查询结果需要通过 toArray() 方法转换
    const articles = await result.toArray()
    res.status(200).json({
      articles,
      count
    })
  } catch (err) {
    next(err)
  }
})

/* PUT 修改文章. */
router.put('/:_id', async (req, res, next) => {
  try {
    const _id = ObjectId(req.params._id) // 注意：MongoDB 自带的 _id 必须用 ObjectId() 包裹，否则匹配不到
    // 更新文档
    await articlesCollection.updateOne({
      _id
    }, {
      $set: req.body // 更新文档必须使用 $set 操作符
    })
    // 返回该条最新文档
    const article = await articlesCollection.findOne({
      _id
    })
    res.status(200).json({
      article
    })
  } catch (err) {
    next(err)
  }
})

/* DELETE 删除文章. */
router.delete('/:_id', async (req, res, next) => {
  try {
    await articlesCollection.deleteOne({
      _id: ObjectId(req.params._id) // 注意：MongoDB 自带的 _id 必须用 ObjectId() 包裹，否则匹配不到
    })
    res.status(200).json({
      code: 200,
      msg: '删除成功'
    })
  } catch (err) {
    next(err)
  }
})

module.exports = router
